class VerwalteterGeldbetrag:
    def __init__(self, anfangsbetrag):
        self.Betrag = anfangsbetrag
    def einzahlenMoeglich(self, betrag):
        return True
    def auszahlenMoeglich(self, betrag):
        return True
    def einzahlen(self, betrag):
        if betrag < 0 or not self.einzahlenMoeglich((betrag)):
            return False
        else:
            self.Betrag += betrag
            return True
    def auszahlen(self, betrag):
        if betrag < 0 or not self.auszahlenMoeglich((betrag)):
            return False
        else:
            self.Betrag -= betrag
            return True
    def zeige(self):
        print("Betrag: {:.2f}".format(self.Betrag))

class VerwalteterBargeldbetrag(VerwalteterGeldbetrag):
    def __init__(self, bargelbetrag):
        if bargelbetrag < 0:
            bargelbetrag = 0
        super().__init__(bargelbetrag)
    def auszahlenMoeglich(self, betrag):
        return (self.Betrag >= betrag)

class AllgemeinesKonto(VerwalteterGeldbetrag):
    def __init__(self, kundendaten, kontostand):
        super().__init__(kontostand)
        self.Kundendaten = kundendaten
    def geldtransfer(self, ziel, betrag):
        if self.auszahlenMoeglich(betrag) and ziel.einzahlenMoeglich(betrag):
            self.auszahlen(betrag)
            ziel.einzahlen(betrag)
            return True
        else:
            return False
    def zeige(self):
        self.Kundendaten.zeige()
        VerwalteterGeldbetrag.zeige(self)

class AllgemeinesKontoMitTagesumsatz(AllgemeinesKonto):
    def __init__(self, kundendaten, kontostand, max_tagesumsatz=1500):
        super().__init__(kundendaten, kontostand)
        self.MaxTagesumsatz = max_tagesumsatz
        self.UmsatzHeute = 0.0
    def transferMoeglich(self, betrag):
        return (self.UmsatzHeute + betrag <= self.MaxTagesumsatz)
    def auszahlenMoeglich(self, betrag):
        return self.transferMoeglich(betrag)
    def einzahlenMoeglich(self, betrag):
        return self.transferMoeglich(betrag)
    def einzahlen(self, betrag):
        if AllgemeinesKonto.einzahlen(self, betrag):
            self.UmsatzHeute += betrag
            return True
        else:
            return False
    def auszahlen(self, betrag):
        if AllgemeinesKonto.auszahlen(self, betrag):
            self.UmsatzHeute += betrag
            return True
        else:
            return False
    def zeige(self):
        AllgemeinesKonto.zeige(self)
        print("Heute schon {:.2f} von {:.2f} Euro umgesetzt".format(self.UmsatzHeute, self.MaxTagesumsatz))

class GirokontoDaten:
    def __init__(self, inhaber, kontonummer):
        self.Inhaber = inhaber
        self.Kontonummer = kontonummer
    def zeige(self):
        print("Inhaber:", self.Inhaber)
        print("Kontonummer:", self.Kontonummer)

class GirokontoMitTagsumsatz(AllgemeinesKontoMitTagesumsatz):
    def __init__(self, inhaber, kontonummer, kontostand, max_tagesumsatz=1500):
        kundendaten = GirokontoDaten(inhaber, kontonummer)
        super().__init__(kundendaten, kontostand, max_tagesumsatz)

class Girokonto(AllgemeinesKonto):
    def __init__(self, inhaer, kontonummer, kontostand):
        kundendaten = GirokontoKundendaten(inhaber, kontonummer)
        super().__init__(kundendaten, kontostand)

class NummernkontoKundendaten:
    def __init__(self, identifikationsnummer):
        self.Identifikationsnummer = identifikationsnummer
    def zeige(self):
        print("Identifikationsnummer:", self.Identifikationsnummer)

class Nummernkonto(AllgemeinesKonto):
    def __init__(self, identifikationsnummer, kontostand):
        kundendaten = NummernkontoKundendaten(identifikationsnummer)
        super().__init__(kundendaten, kontostand)

class NummernkontoMitTagesumsatz(AllgemeinesKontoMitTagesumsatz):
    def __init__(self, kontonummer, kontostand, max_tagesumsatz):
        kundendaten = NummernkontoKundendaten(kontonummer)
        super().__init__(kundendaten, kontostand, max_tagesumsatz)

class Geldboerse(VerwalteterBargeldbetrag):
    # TODO: Spezielle Methoden fuer eine Geldboerse
    pass

class Tresor(VerwalteterBargeldbetrag):
    # TODO: Spezielle Methoden fuer einen Tresor
    pass

k1 = GirokontoMitTagsumsatz("Heinz Meier", 567123, 12350.0)
k2 = GirokontoMitTagsumsatz("Erwin Schmidt", 396754, 15000.0)
print(k1.geldtransfer(k2, 160))
print(k2.geldtransfer(k1, 1000))
print(k2.geldtransfer(k1, 500))
print(k2.einzahlen(500))
k1.zeige()
k2.zeige()

print()
nk1 = Nummernkonto(113427613185, 5000)
nk2 = NummernkontoMitTagesumsatz(45657364234, 12000, 3000)
print(nk1.auszahlen(1000))
print(nk2.einzahlen(1500))
print(nk1.geldtransfer(nk2, 2000))
nk1.zeige()
nk2.zeige()